#pragma once
#include <iostream>
#include <string>
#include <vector>
#include "InetAddr.hpp"
#include "log.hpp"
#include"Lock.hpp"
using namespace LogModule;
class Routine
{
public:
    Routine()
    {
    }
    bool IsExit(InetAddr &cli)
    {
        for (auto &i : _USERS)
        {
            if (i == cli)
            {
                return true;
            }
        }
        return false;
    }
    void AddUser(InetAddr &cli)
    {
        _USERS.push_back(cli);
    }
    void DeleteUser(InetAddr &cli)
    {
        for (auto i = _USERS.begin(); i != _USERS.end(); i++)
        {
            if (*i == cli)
            {
                i=_USERS.erase(i);
                return;
            }
        }
        LOG(LogLevel::INFO) << "用户不存在/用户已删除！！";
    }
    void SendtoAll(int sockfd, std::string messager, InetAddr &cli)
    {
        std::string newmessager = cli.StringAddr() + messager;

        for (auto &i : _USERS)
        {
            sendto(sockfd, newmessager.c_str(), newmessager.size(), 0, (const sockaddr *)&(i.Netaddr()), sizeof(i.Netaddr()));
        }
    }

    //往线程池中主要包装的任务
    void Routne(int sockfd, std::string messager, InetAddr &cli)
    {

        
        //首先加锁避免多线程访问对临界资源产生干扰
        LockGuard lock(_mutex);
        // 首先判断用户是否是第一次发消息
        // 如果是则插入用户信息再漫游，如果已经存在则直接漫游即可
        if (!IsExit(cli))
        {
            LOG(LogLevel::INFO) << "新增一个用户信息";
            AddUser(cli);
            SendtoAll(sockfd,messager,cli);
            return;
        }
        // 确认用户是第一次发消息，判断消息种类
        if (messager == "QUIT")
        {
            LOG(LogLevel::INFO) << "删除一个用户信息";
            SendtoAll(sockfd,messager,cli);
            DeleteUser(cli);
            return;
        }
        SendtoAll(sockfd,messager,cli);
    }
    ~Routine()
    {
    }

private:
    std::vector<InetAddr> _USERS;

    Mutex _mutex;
};
